package Railroad;

import Railroad.Components.Signal;
import Railroad.GUI.RiadenieNavestidiel;
import java.awt.Color;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author Steeween
 */
public class ObsadzovacCiest {

    private final ArrayList<Track> zoznamCiest;
    private final ArrayList<Integer> zatialVyhovujuce = new ArrayList<>();
    protected RiadenieNavestidiel riadenie;
    public ObsadzovacCiest(ArrayList<Track> paZoznamCiest,RiadenieNavestidiel r) {
        zoznamCiest = paZoznamCiest;
        riadenie=r;
    }

    public ArrayList<Track> getTrackList() {
        return zoznamCiest;
    }

    public void obsadCestu(int x, int y) {///////////////////pozn navestidla co idu do lava so m posunul o 1 do lava aby cez navestidlo pri vikreslovani nesla bliela ciara
        if (zatialVyhovujuce.isEmpty()) {
            //boolean nudzova=false;
            for (int i = 0; i < zoznamCiest.size(); i++) {
                Track track = zoznamCiest.get(i);
                
                Signal navestidlo = track.dajStartovacieNavestidlo();
                if (navestidlo.isOnXY(x, y)) {
                    if (navestidlo.getColor() == Signal.defaultColor) {
                        zatialVyhovujuce.add(i);
                        Color c;

                        if (navestidlo.isMain()) {
                            c = Color.GREEN;
                        } else {
                            c = Color.WHITE;
                        }

                        navestidlo.setBGcolor(c);
                    }
                }
            }
           
        } else {
            for (int i = 0; i < zatialVyhovujuce.size(); i++) {
                Track track = zoznamCiest.get(zatialVyhovujuce.get(i));
                Signal navestidlo = track.dajStartovacieNavestidlo();
                // if (track.skontrolujKlik(x, y) && daPaPostavit(track)) {
               if(!track.jePosunova()){
                   if (track.skontrolujKlik(x, y)) {
                    
                    if (!daPaPostavit(track)) {
                        int odpoved = JOptionPane.showConfirmDialog(null, "Chcete postavit nudzovu cestu");

                        if (odpoved == JOptionPane.YES_OPTION) {
                            track.obsadCestu(riadenie);
                        }
                        zatialVyhovujuce.clear();
                        track.setNudzova(true);
                        navestidlo.setColor(Signal.defaultColor);
                        navestidlo.setBGcolor(Color.BLACK);




                    } else {
                        track.obsadCestu(riadenie);
                        zatialVyhovujuce.clear();
                        navestidlo.setColor(track.getColor());
                        navestidlo.setBGcolor(Color.BLACK);
                        track.setNudzova(false);
                    }
                }
                if(y==13&&x==41){
                    String potvrdenie= JOptionPane.showInputDialog(null,"Zadajte potvrdzovaciu sekvenciu" );
                    if(potvrdenie.compareTo("asdf")==0)
                    {
                    navestidlo.setColor(Color.WHITE);
                    navestidlo.setBGcolor(Color.BLACK);
                    riadenie.prestavNavestidla();
                     new RusicPrivolavacejNavesti(navestidlo, riadenie).start();
                    }
                    zatialVyhovujuce.clear();
                    break;
                }
            
            }else{///pre posunove cesty
                  if (track.skontrolujKlik(x, y) ) {
                       track.obsadCestu(riadenie);
                       zatialVyhovujuce.clear();
                        navestidlo.setColor(track.getColor());
                        navestidlo.setBGcolor(Color.BLACK);
                       track.setNudzova(false);
                  }
                    }
            }
        }
    }

    private boolean daPaPostavit(Track track) {
        return track.volna();
    }

    private Track najdiCestuSNavestidlomNa(int x, int y) {
        for (int i = 0; i < zoznamCiest.size(); i++) {
            Track cesta = zoznamCiest.get(i);
            if (cesta.jeVytvorena()
                    && cesta.dajStartovacieNavestidlo().isOnXY(x, y)) {
                return cesta;
            }
        }

        return null;
    }

    public void zrusOznacenie() {
        for (Integer id : zatialVyhovujuce) {
            Track tr = zoznamCiest.get(id);
            tr.dajStartovacieNavestidlo().setBGcolor(Color.BLACK);
        }
        zatialVyhovujuce.clear();
    }

    public void odznacCestu(int x, int y) {
        if (!zatialVyhovujuce.isEmpty()) {
            zatialVyhovujuce.clear();
        } else {
            Track cesta = najdiCestuSNavestidlomNa(x, y);
            if (cesta != null) {

                //  cesta.dajStartovacieNavestidlo().setColor(Signal.defaultColor);
                cesta.setNudzova(false);
                cesta.zrusCestu();

            }
        }
    }

    public void zrusCestu(int x, int y) {
        if (!zatialVyhovujuce.isEmpty()) {
            //  zatialVyhovujuce.clear();
        } else {
            Track cesta = najdiCestuSNavestidlomNa(x, y);
            if (cesta != null) {
                new RusicCesty(cesta,riadenie).start();
            }
        }
    }

    public void odznacZvysok(int x, int y) {
        if (!zatialVyhovujuce.isEmpty()) {
            zatialVyhovujuce.clear();
        } else {
            Track cesta = najdiCestuSNavestidlomNa(x, y);
            if (cesta != null) {
                cesta.zrusCestu();
            }
        }
    }
}


class VytvaracCesty implements Runnable {

    private final Track track;
private RiadenieNavestidiel riadenie;
    public VytvaracCesty(Track track, RiadenieNavestidiel r) {
        this.track = track;
        riadenie=r;
    }

    @Override
    public void run() {
        try {
            faza1();
            prepinanieVyhybiek();
            faza3();
            fazaBiela();
            hotovo();
        } catch (InterruptedException ex) {
        }
    }

    private void faza1() throws InterruptedException {
        track.zmenStav(StavVytvoreniaCesty.faza1);
        Thread.sleep(3000);
    }

    private void prepinanieVyhybiek() throws InterruptedException {
        track.zmenStav(StavVytvoreniaCesty.prepinanieVyhybiek);
        track.nastavVyhybky();
        while (!track.maNastaveneVyhybky()) {
            Thread.sleep(250);
        }
    }

    private void faza3() throws InterruptedException {
        track.zmenStav(StavVytvoreniaCesty.faza3);
        Thread.sleep(2500);
    }

    private void fazaBiela() throws InterruptedException {
        track.zmenStav(StavVytvoreniaCesty.fazaBiela);
        Thread.sleep(500);
    }

    private void hotovo() {
        riadenie.prestavNavestidla();
        track.zmenStav(StavVytvoreniaCesty.vytvorena);
        if (track.isNudzova()) {
            track.dajStartovacieNavestidlo().setColor(Signal.defaultColor);
        } else {
            track.dajStartovacieNavestidlo().setColor(track.getColor());
        } 
        
       
    }
}

class RusicCesty implements Runnable {

    private final Track track;
    private RiadenieNavestidiel riadenie;
    public RusicCesty(Track track, RiadenieNavestidiel r) {
        this.track = track;
        riadenie=r;
    }

    public void start() {
        new Thread(this).start();
    }

    @Override
    public void run() {
        track.zmenStav(StavVytvoreniaCesty.rusena);
        try {
            track.dajStartovacieNavestidlo().setColor(Signal.defaultColor);
            riadenie.prestavNavestidla();
            Thread.sleep(3000);
        } catch (InterruptedException ex) {
        } finally {
            if (!track.jePouzita()) {
                track.zrusCestu();
            } else if (track.jeRusena()) {
                track.zmenStav(StavVytvoreniaCesty.vytvorena);
            }
        }
    }
}
    class RusicPrivolavacejNavesti implements Runnable {// moze zrusit cestu ak sa postavia 2 cesty v ramci jednej minuty s pouzitim toho isteho navestidla

    private final Signal navestidlo;
    private RiadenieNavestidiel riadenie;
    public RusicPrivolavacejNavesti(Signal navestidlo, RiadenieNavestidiel r) {
        this.navestidlo = navestidlo;
        riadenie=r;
    }

    public void start() {
        new Thread(this).start();
    }

    @Override
    public void run() {
        //track.zmenStav(StavVytvoreniaCesty.rusena);
        try {
            
            Thread.sleep(60000);
            if(navestidlo.getColor()==Color.WHITE)
            {
            navestidlo.setColor(Signal.defaultColor);
            riadenie.prestavNavestidla();
            }
        } catch (InterruptedException ex) {}
    }
}

